home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 2108 / 2108.xpi / content / base-test.js next >
Text File  |  2009-08-03  |  27KB  |  607 lines

  1. Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
  2. var Style = Components.classes["@userstyles.org/style;1"].getService(Components.interfaces.stylishStyle);
  3. var observerService = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
  4.  
  5. //Test styles getting saved
  6. function testStyleSave() {
  7.     var style = Components.classes["@userstyles.org/style;1"].createInstance(Components.interfaces.stylishStyle);
  8.     assert("Style is null", style);
  9.     const url = "http://example.com";
  10.     const updateUrl = "http://example.com/update";
  11.     const md5Url = "http://example.com/md5";
  12.     const name = "Example style";
  13.     const code = "#example { color: red;}";
  14.     style.init(url, updateUrl, md5Url, name, code, false, null);
  15.     checkValues(style, url, updateUrl, md5Url, name, code);
  16.     style.save();
  17.     assert("Style didn't get an ID", style.id != null && style.id != 0);
  18.     var id = style.id;
  19.     style = Style.find(id, 0);
  20.     assert("Style saved but not loaded", style);
  21.     checkValues(style, url, updateUrl, md5Url, name, code);
  22.     const newName = "Example style @2";
  23.     style.name = newName;
  24.     style.save();
  25.     style = Style.find(id, 0);
  26.     assert("Style not updated", style.name == newName);    
  27.     style.delete();
  28.     style = Style.find(id, 0);
  29.     assert("Style not deleted", style == null);
  30. };
  31.  
  32. //Test styles getting applied
  33. function testStyleApplied() {
  34.     var style = Components.classes["@userstyles.org/style;1"].createInstance(Components.interfaces.stylishStyle);
  35.     style.init(null, null, null, "Unit test", "button { text-decoration: underline !important;}", true, null);
  36.     assert("Style was not enabled", style.enabled);
  37.     assert("Style was not applied", getButtonStyle().textDecoration == "underline");
  38.     style.enabled = false;
  39.     delay(100);
  40.     assert("Style was not unapplied", getButtonStyle().textDecoration == "none");
  41.     style.enabled = true;
  42.     delay(100);
  43.     assert("Style was not applied the second time", getButtonStyle().textDecoration == "underline");
  44.     style.code = "button { font-style: italic !important;}"
  45.     delay(100);
  46.     assert("Style was not unapplied on change", getButtonStyle().textDecoration == "none");
  47.     assert("Style was not appled on change", getButtonStyle().fontStyle == "italic");
  48.     style.enabled = false;
  49.     delay(100);
  50.     assert("Style was not unapplied the second time", getButtonStyle().fontStyle == "normal");
  51. }
  52.  
  53. //Tests that deleted styles get unapplied
  54. function testDeleteAndUnapply() {
  55.     var style = Components.classes["@userstyles.org/style;1"].createInstance(Components.interfaces.stylishStyle);
  56.     style.init(null, null, null, "Unit test", "button { text-decoration: underline !important;}", true, null);
  57.     style.save();
  58.     style = Style.find(style.id, Style.REGISTER_STYLE_ON_CHANGE);
  59.     style.delete();
  60.     assert("Deleted style not removed", getButtonStyle().textDecoration != "underline");    
  61. }
  62.  
  63. //Test appliesToUrl on url rules
  64. function testUrlMatch() {
  65.     var style = Components.classes["@userstyles.org/style;1"].createInstance(Components.interfaces.stylishStyle);
  66.     style.init(null, null, null, "Unit test", "@-moz-document url('http://google.com') { * {color: blue}}", false, null);
  67.     function v() {
  68.         assert("Style not marked as applied.", style.appliesToUrl("http://google.com"));
  69.         assert("Style incorrectly marked as applied.", !style.appliesToUrl("http://yahoo.com"));
  70.         assert("Style incorrectly marked as applied.", !style.appliesToUrl("http://google.com/foo"));
  71.     }
  72.     v();
  73.     style.save();
  74.     try {
  75.         style = Style.find(style.id, 0);
  76.         v();
  77.     } finally {
  78.         style.delete();
  79.     }
  80. }
  81.  
  82. //Test appliesToUrl on url prefix rules
  83. function testUrlPrefixMatch() {
  84.     var style = Components.classes["@userstyles.org/style;1"].createInstance(Components.interfaces.stylishStyle);
  85.     style.init(null, null, null, "Unit test", "@-moz-document url-prefix('http://google.com') { * {color: blue}}", false, null);
  86.     function v() {
  87.         assert("Style not marked as applied.", style.appliesToUrl("http://google.com"));
  88.         assert("Style not marked as applied.", style.appliesToUrl("http://google.com/foo"));
  89.         assert("Style incorrectly marked as applied.", !style.appliesToUrl("http://yahoo.com"));
  90.     }
  91.     v();
  92.     style.save();
  93.     try {
  94.         style = Style.find(style.id, 0);
  95.         v();
  96.     } finally {
  97.         style.delete();
  98.     }
  99. }
  100.  
  101. //Test appliesToUrl on domain rules
  102. function testDomainMatch() {
  103.     var style = Components.classes["@userstyles.org/style;1"].createInstance(Components.interfaces.stylishStyle);
  104.     style.init(null, null, null, "Unit test", "@-moz-document domain('google.com') { * {color: blue}}", false, null);
  105.     function v() {
  106.         assert("Style not marked as applied 1.", style.appliesToUrl("http://google.com"));
  107.         assert("Style not marked as applied 2.", style.appliesToUrl("http://google.com/foo"));
  108.         assert("Style not marked as applied 3.", style.appliesToUrl("http://www.google.com/foo"));
  109.         assert("Style not marked as applied 4.", style.appliesToUrl("http://foo.www.google.com/foo"));
  110.         assert("Style incorrectly marked as applied 1.", !style.appliesToUrl("http://yahoo.com"));
  111.         assert("Style incorrectly marked as applied 2.", !style.appliesToUrl("http://google.com.br"));
  112.         assert("Style incorrectly marked as applied 3.", !style.appliesToUrl("http://notgoogle.com"));
  113.     }
  114.     v();
  115.     style.save();
  116.     try {
  117.         style = Style.find(style.id, 0);
  118.         v();
  119.     } finally {
  120.         style.delete();
  121.     }
  122. }
  123.  
  124. //Load a style then update the code
  125. function testLoadAndUpdateCode() {
  126.     try {
  127.         //first make the style
  128.         var style = Components.classes["@userstyles.org/style;1"].createInstance(Components.interfaces.stylishStyle);
  129.         var code = "* {font-style: italic;}";
  130.         style.init(null, null, null, "Unit test - load and update code", code, true, null);
  131.         style.save();
  132.         //now load it
  133.         style = Style.find(style.id, Style.REGISTER_STYLE_ON_CHANGE);
  134.         //update it
  135.         style.code = "* { text-decoration: underline}";
  136.         style.save();
  137.         assert("Old code not removed", getButtonStyle().fontStyle != "italic");    
  138.         assert("New code not applied", getButtonStyle().textDecoration == "underline");
  139.     } finally {
  140.         style.delete();
  141.     }
  142. }
  143.  
  144. //Load a style then update the name (the name is part of the data url)
  145. function testLoadAndUpdateName() {
  146.     try {
  147.         //first make the style
  148.         var style = Components.classes["@userstyles.org/style;1"].createInstance(Components.interfaces.stylishStyle);
  149.         var code = "* {font-style: italic;}";
  150.         style.init(null, null, null, "Unit test - load and update name", code, true, null);
  151.         style.save();
  152.         //now load it
  153.         style = Style.find(style.id, Style.REGISTER_STYLE_ON_CHANGE);
  154.         //update it
  155.         style.name = "Unit test - load and update name - new name";
  156.         style.save();
  157.     } finally {
  158.         style.delete();
  159.     }
  160.     //once deleted it should no longer be applied
  161.     assert("Old code not removed", getButtonStyle().fontStyle != "italic");    
  162. }
  163.  
  164.  
  165. //Test the preview function on an enabled style
  166. function testPreviewEnabled() {
  167.     try {
  168.         var style = Components.classes["@userstyles.org/style;1"].createInstance(Components.interfaces.stylishStyle);
  169.         var code = "* {font-style: italic;}";
  170.         style.init(null, null, null, "Unit test - preview", code, true, null);
  171.         assert("Style not initially applied", getButtonStyle().fontStyle == "italic");
  172.         style.setPreview(true);
  173.         assert("Style no longer applied after preview turned on", getButtonStyle().fontStyle == "italic");
  174.         style.code = "* { text-decoration: underline}";
  175.         assert("Saved style not unapplied", getButtonStyle().fontStyle != "italic");
  176.         assert("Style preview not applied", getButtonStyle().textDecoration == "underline");
  177.         style.setPreview(false);
  178.         assert("Saved style reapplied", getButtonStyle().fontStyle != "italic");
  179.         assert("Style preview unapplied", getButtonStyle().textDecoration == "underline");
  180.     } finally {
  181.         style.enabled = false;
  182.     }
  183. }
  184.  
  185. //Test the preview function on a disabled style
  186. function testPreviewDisabled() {
  187.     try {
  188.         var style = Components.classes["@userstyles.org/style;1"].createInstance(Components.interfaces.stylishStyle);
  189.         var code = "* {font-style: italic;}";
  190.         style.init(null, null, null, "Unit test - preview", code, false, null);
  191.         assert("Style initially applied", getButtonStyle().fontStyle != "italic");
  192.         style.setPreview(true);
  193.         assert("Style not applied after preview turned on", getButtonStyle().fontStyle == "italic");
  194.         style.code = "* { text-decoration: underline}";
  195.         assert("Saved style not unapplied", getButtonStyle().fontStyle != "italic");
  196.         assert("Style preview not applied", getButtonStyle().textDecoration == "underline");
  197.         style.setPreview(false);
  198.         assert("Previous style not unapplied", getButtonStyle().fontStyle != "italic");
  199.         assert("Style preview not unapplied", getButtonStyle().textDecoration != "underline");
  200.     } finally {
  201.         style.enabled = false;
  202.     }
  203. }
  204.  
  205. //Test the preview function on a disabled, saved style
  206. function testPreviewDisabledSaved() {
  207.     try {
  208.         var style = Components.classes["@userstyles.org/style;1"].createInstance(Components.interfaces.stylishStyle);
  209.         var code = "* {font-style: italic;}";
  210.         style.init(null, null, null, "Unit test - preview", code, false, null);
  211.         assert("Style applied on init", getButtonStyle().fontStyle != "italic");
  212.         style.save();
  213.         assert("Style applied on init", getButtonStyle().fontStyle != "italic");
  214.         style = Style.find(style.id, Style.REGISTER_STYLE_ON_CHANGE);
  215.         style.code = "* { text-decoration: underline}";
  216.         style.setPreview(true);
  217.         assert("Style change not applied", getButtonStyle().textDecoration == "underline");
  218.         assert("Style not applied after preview turned on", getButtonStyle().fontStyle != "italic");
  219.         style.code = "* {font-style: italic;}";
  220.         assert("Style change back did not remove new style", getButtonStyle().color != "blue");
  221.         assert("Style change back add not remove old style", getButtonStyle().fontStyle == "italic");
  222.     } finally {
  223.         style.enabled = false;
  224.         style.delete();
  225.     }
  226. }
  227.  
  228.  
  229. //Test various things being blank
  230. function testBlankApply() {
  231.     //enabling a blank style
  232.     var style = Components.classes["@userstyles.org/style;1"].createInstance(Components.interfaces.stylishStyle);
  233.     style.enabled = true;
  234.  
  235.     //applying code when there is no name
  236.     style.code = "* {font-style: italic;}"
  237.     assert("Style not initially applied", getButtonStyle().fontStyle == "italic");
  238.  
  239.     //giving an applied style a name
  240.     style.name = "Foo";
  241.     style.enabled = false;
  242.     assert("Style not unapplied", getButtonStyle().fontStyle != "italic");
  243.  
  244.     //nulling code
  245.     style.enabled = true;
  246.     style.code = null;
  247.     assert("Style not unapplied after null", getButtonStyle().fontStyle != "italic");
  248.  
  249.     //clean up
  250.     style.enabled = false;
  251. }
  252.  
  253.  
  254. //Test arbritrary meta values
  255. function testMeta() {
  256.     var style = Components.classes["@userstyles.org/style;1"].createInstance(Components.interfaces.stylishStyle);
  257.     style.code = "*{}";
  258.     style.name = "foo";
  259.     style.addMeta("foo", "bar");
  260.     style.save();
  261.     try {
  262.         style = Style.find(style.id, 0);
  263.         var vals = style.getMeta("foo", {});
  264.         assert("Meta not applied", vals.length == 1 && vals[0] == "bar");
  265.         vals = style.getMeta("baz", {});
  266.         assert("Wrong meta returned", vals.length == 0);
  267.         style.removeMeta("foo", "wrong value");
  268.         vals = style.getMeta("foo", {});
  269.         assert("Meta mistakenly removed", vals.length == 1 && vals[0] == "bar");    
  270.         style.removeMeta("foo", "bar");    
  271.         vals = style.getMeta("foo", {});
  272.         assert("Meta not removed", vals.length == 0);
  273.         style.addMeta("foo", "sna");
  274.         style.addMeta("wha", "tthe");
  275.         style.save();
  276.         style = Style.find(style.id, 0);
  277.         vals = style.getMeta("foo", {});
  278.         assert("Meta not applied the second time - found " + vals.length, vals.length == 1 && vals[0] == "sna");
  279.         style.removeAllMeta("foo");
  280.         style.save();
  281.         style = Style.find(style.id, 0);
  282.         vals = style.getMeta("foo", {});
  283.         assert("Meta not removed with removeAllMeta", vals.length == 0);
  284.         vals = style.getMeta("wha", {});
  285.         assert("Wrong meta removed with removeAllMeta", vals.length > 0);
  286.     } finally {
  287.         style.delete();
  288.     }
  289. }
  290.  
  291. function testAppliesSearch() {
  292.     var styles = Style.findForUrl("http://thisisnotarealdomain.com", false, 0, {});
  293.     assert("Style pre-existing", styles.length == 0);
  294.     var style = Components.classes["@userstyles.org/style;1"].createInstance(Components.interfaces.stylishStyle);
  295.     style.code = "@-moz-document domain('thisisnotarealdomain.com') {}";
  296.     style.name = "foo";
  297.     style.save();
  298.     var id = style.id;
  299.     try {
  300.         styles = Style.findForUrl("http://thisisnotarealdomain.com", false, 0, {});
  301.         assert("Style not found", styles.length == 1);
  302.         assert("Incorrect style found", styles[0].id == id);
  303.     } finally {
  304.         style.delete();
  305.     }
  306. }
  307.  
  308. //Test some invalid CSS
  309. var badCSSError = null;
  310. function testBadCSSSetup() {
  311.     var errorListener = {
  312.         QueryInterface: XPCOMUtils.generateQI([Components.interfaces.nsIConsoleListener, Components.interfaces.nsISupports]),
  313.         observe: function(message) {
  314.             badCSSError = message.QueryInterface(Components.interfaces.nsIConsoleMessage).message;
  315.         }
  316.     }
  317.     Style.checkForErrors("* {foo:bar;}", errorListener);
  318. }
  319. function asyncBadCSSComplete() {
  320.     assert("Didn't find the errors", /foo/.test(badCSSError));
  321. }
  322.  
  323.  
  324. function testType() {
  325.     function ensureType(message, type) {
  326.         var currentType = style.getTypes({});
  327.         if (typeof type == "string")
  328.             type = [type];
  329.         assert(message + " - expected '" + type + "' got '" + currentType +"'", arraysEqual(currentType, type));
  330.     }
  331.     var style = Components.classes["@userstyles.org/style;1"].createInstance(Components.interfaces.stylishStyle);
  332.     style.init(null, null, null, "Unit test", "* {color: blue}", false, null);
  333.     ensureType("No namespace no moz-doc", "global");
  334.     style.code = "@namespace url('http://www.w3.org/1999/xhtml');* {color: blue}";
  335.     ensureType("HTML namespace no moz-doc", "global");
  336.     style.code = "@namespace url('http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul');* {color: blue}";
  337.     ensureType("XUL namespace no moz-doc", "app");
  338.     style.code = "@namespace url('http://www.w3.org/1999/xhtml');@-moz-document domain(google.com){* {color: blue}}";
  339.     ensureType("HTML namespace and domain rule", "site");
  340.     style.code = "@namespace url('http://www.w3.org/1999/xhtml');@-moz-document url(http://google.com){* {color: blue}}";
  341.     ensureType("HTML namespace and URL rule", "site");
  342.     style.code = "@namespace url('http://www.w3.org/1999/xhtml');@-moz-document url-prefix(http://google.com){* {color: blue}}";
  343.     ensureType("HTML namespace and URL prefix rule", "site");
  344.     style.code = "@-moz-document url-prefix(chrome://stylish){* {color: blue}}";
  345.     ensureType("No namespace and chrome URL prefix rule", "app");
  346.     style.code = "@-moz-document url-prefix(http://google.){* {color: blue}}*{color:blue}";
  347.     ensureType("No namespace, http URL prefix rule, and no -moz-doc rule", ["global","site"]);
  348.     style.code = "@-moz-document url-prefix(http://){* {color: blue}}";
  349.     ensureType("No namespace, http:// only URL prefix rule", "global");
  350.     style.code = "@-moz-document url-prefix(http:){* {color: blue}}";
  351.     ensureType("No namespace, http: only URL prefix rule isn't global", "global");
  352.     style.code = "@-moz-document url-prefix(http){* {color: blue}}";
  353.     ensureType("No namespace, http only URL prefix rule isn't global", "global");
  354.     style.code = "@-moz-document domain(google.com){* {color: blue}}";
  355.     ensureType("No namespace, domain rule", "site");
  356. }
  357.  
  358. function testFindByUrl() {
  359.     try {
  360.         var style = Components.classes["@userstyles.org/style;1"].createInstance(Components.interfaces.stylishStyle);
  361.         const url = "http://example.com/foo/bar";
  362.         style.init(url, null, null, "Unit test", "/**/", false, null);
  363.         style.save();
  364.         style = Style.findByUrl(url, 0);
  365.         assert("Style not found", style);
  366.     } finally {
  367.         style.delete();
  368.     }
  369. }
  370.  
  371. function testSaveOriginalCodeNoUpdate() {
  372.     try {
  373.         var style = Components.classes["@userstyles.org/style;1"].createInstance(Components.interfaces.stylishStyle);
  374.         const url = "http://example.com/foo/bar";
  375.         style.init(url, null, null, "Unit test - save original code no update", "/* original code */", false, null);
  376.         style.save();
  377.         assert("Style got original code for no reason", style.originalCode == null);
  378.         style.code = "/* new code */";
  379.         style.save();
  380.         assert("Style didn't get new code", style.code == "/* new code */");
  381.         assert("Style got original code though there is no possibility of update", style.originalCode == null);
  382.     } finally {
  383.         style.delete();
  384.     }
  385. }
  386.  
  387. function testSaveOriginalCodeWithUpdate() {
  388.     try {
  389.         var style = Components.classes["@userstyles.org/style;1"].createInstance(Components.interfaces.stylishStyle);
  390.         const url = "http://example.com/foo/bar";
  391.         style.init(url, "http://example.com/update", "http://example.com/update", "Unit test - save original code with update", "/* original code */", false, null);
  392.         style.save();
  393.         assert("Style got original code for no reason", style.originalCode == null);
  394.         style.code = "/* new code */";
  395.         style.save();
  396.         assert("Style didn't get new code", style.code == "/* new code */");
  397.         assert("Style didn't get original code, it was: " + style.originalCode, style.originalCode == "/* original code */");
  398.         style = Style.find(style.id, 0);
  399.         style.code = "/* newer code */";
  400.         assert("Style's original code was updated", style.originalCode == "/* original code */");
  401.     } finally {
  402.         style.delete();
  403.     }
  404. }
  405.  
  406. function testSaveOriginalCodeInitial() {
  407.     try {
  408.         var style = Components.classes["@userstyles.org/style;1"].createInstance(Components.interfaces.stylishStyle);
  409.         const url = "http://example.com/foo/bar";
  410.         style.init(url, "http://example.com/update", "http://example.com/update", "Unit test - save original code initial", "/* original code */", false, "/* original code */");
  411.         style.code = "/* new code */";
  412.         style.save();
  413.         assert("Style didn't get new code", style.code == "/* new code */");
  414.         assert("Style didn't get original code, it was: " + style.originalCode, style.originalCode == "/* original code */");
  415.     } finally {
  416.         style.delete();
  417.     }
  418. }
  419.  
  420. function testLineBreak() {
  421.     try {
  422.         var style = Components.classes["@userstyles.org/style;1"].createInstance(Components.interfaces.stylishStyle);
  423.         style.init(null, null, null, "Unit test - whitespace", "#test {\nbackground-image: url('data:image/png;base64,\niVBORw0KGgoAAAANSUhEUgAAABEAAAARCAYAAAA7bUf6AAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A\n/wD/oL2nkwAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAAd0SU1FB9kHGBYWMPyCHp4AAAGVSURBVDjL\ntZM/S5tBHMc/jzkxSynRteASOtSOlg4ZBIlB6htw7dI4dHGza1+CFMzTsRAVFHRSsOQtJLhkESqF\nLl2a8Dw+9+R57rk7h2gS8+TRIvqb7o7vffn+uYMnGOd2Uau5Ngu0sVF17iMRo5tq9VMK4LrfH1Ry\nhySU8lF2xKgVz/cmgsattlpNXNd1UkoqlRWkDFMElcpK6qzVak62c3b2M1PuzosqACbOYXs5Snyc\nTDL/finbdBvWy5sA/Ki72cEuv32N0pBoi9KWOAGlLZG20O5joji8vx1lLImBWIPS8OF0WJyJc0Qq\nJIg8dCBoFA4obs1aczXNr29/nQEySfqX+yr6ZdxaiOKQIPTwZZd35QU8+Q9fdrk8FmNKbizE2qIS\ni1FTNwSSoOfjyy6+7AwIHEDLMZI4sSgzzMH2BLsn2+jODDoQLJbf4MkO5/UAG+bRvVw6k69fPt8J\na7TGRuEQL+hwFXYxMs/ay1XcveFjc/7nWRe35uyrksABLup5/uz/djL/TtboQHB5JNBSYCLBs8w1\nd7/MECNU588AAAAASUVORK5CYII=\n')\n}", false, "null");
  424.         style.enabled = true;
  425.         delay(100);
  426.         assert("Style with line breaks worked", getButtonStyle().backgroundImage == "none");
  427.         style.code = "#test {background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAYAAAA7bUf6AAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAAd0SU1FB9kHGBYWMPyCHp4AAAGVSURBVDjLtZM/S5tBHMc/jzkxSynRteASOtSOlg4ZBIlB6htw7dI4dHGza1+CFMzTsRAVFHRSsOQtJLhkESqFLl2a8Dw+9+R57rk7h2gS8+TRIvqb7o7vffn+uYMnGOd2Uau5Ngu0sVF17iMRo5tq9VMK4LrfH1RyhySU8lF2xKgVz/cmgsattlpNXNd1UkoqlRWkDFMElcpK6qzVak62c3b2M1PuzosqACbOYXs5SnycTDL/finbdBvWy5sA/Ki72cEuv32N0pBoi9KWOAGlLZG20O5joji8vx1lLImBWIPS8OF0WJyJc0QqJIg8dCBoFA4obs1aczXNr29/nQEySfqX+yr6ZdxaiOKQIPTwZZd35QU8+Q9fdrk8FmNKbizE2qISi1FTNwSSoOfjyy6+7AwIHEDLMZI4sSgzzMH2BLsn2+jODDoQLJbf4MkO5/UAG+bRvVw6k69fPt8Ja7TGRuEQL+hwFXYxMs/ay1XcveFjc/7nWRe35uyrksABLup5/uz/djL/TtboQHB5JNBSYCLBs8w1d7/MECNU588AAAAASUVORK5CYII=')}";
  428.         assert("Style with line break stripped didn't work", getButtonStyle().backgroundImage != "none");
  429.     } finally {
  430.         style.enabled = false;
  431.     }
  432. }
  433.  
  434. var updateMd5NoUpdate = null;
  435. var updateMd5NoUpdateObserver = {
  436.     observe: function(subject, topic, data) {
  437.         if (subject.name == "testUpdateMd5NoUpdate") {
  438.             updateMd5NoUpdate = data;
  439.         }
  440.     }
  441. }
  442. function testUpdateMd5NoUpdate() {
  443.     var style = Components.classes["@userstyles.org/style;1"].createInstance(Components.interfaces.stylishStyle);
  444.     style.init(null, null, "data:text/plain,2642306a8b25001880ccb55e68456165", "testUpdateMd5NoUpdate", "* {color: blue}", false, null);
  445.     observerService.addObserver(updateMd5NoUpdateObserver, "stylish-style-update-check-done", false);
  446.     style.checkForUpdates();
  447. }
  448. function asyncUpdateMd5NoUpdate() {
  449.     observerService.removeObserver(updateMd5NoUpdateObserver, "stylish-style-update-check-done");
  450.     assert("Expected 'no-update-available', got '" + updateMd5NoUpdate + "'.", updateMd5NoUpdate == "no-update-available");
  451. }
  452.  
  453.  
  454. var updateMd5WithUpdate = null;
  455. var updateMd5WithUpdateObserver = {
  456.     observe: function(subject, topic, data) {
  457.         if (subject.name == "testUpdateMd5WithUpdate") {
  458.             updateMd5WithUpdate = data;
  459.         }
  460.     }
  461. }
  462. function testUpdateMd5WithUpdate() {
  463.     var style = Components.classes["@userstyles.org/style;1"].createInstance(Components.interfaces.stylishStyle);
  464.     style.init(null, null, "data:text/plain,adifferentchecksum", "testUpdateMd5WithUpdate", "* {color: blue}", false, null);
  465.     observerService.addObserver(updateMd5WithUpdateObserver, "stylish-style-update-check-done", false);
  466.     style.checkForUpdates();
  467. }
  468. function asyncUpdateMd5WithUpdate() {
  469.     observerService.removeObserver(updateMd5WithUpdateObserver, "stylish-style-update-check-done");
  470.     assert("Expected 'update-available', got '" + updateMd5WithUpdate + "'.", updateMd5WithUpdate == "update-available");
  471. }
  472.  
  473.  
  474. var updateUrlNoUpdate = null;
  475. var updateUrlNoUpdateObserver = {
  476.     observe: function(subject, topic, data) {
  477.         if (subject.name == "testUpdateUrlNoUpdate") {
  478.             updateUrlNoUpdate = data;
  479.         }
  480.     }
  481. }
  482. function testUpdateUrlNoUpdate() {
  483.     var style = Components.classes["@userstyles.org/style;1"].createInstance(Components.interfaces.stylishStyle);
  484.     style.init(null, "data:text/css,* {color: blue}", null, "testUpdateUrlNoUpdate", "* {color: blue}", false, null);
  485.     observerService.addObserver(updateUrlNoUpdateObserver, "stylish-style-update-check-done", false);
  486.     style.checkForUpdates();
  487. }
  488. function asyncUpdateUrlNoUpdate() {
  489.     observerService.removeObserver(updateUrlNoUpdateObserver, "stylish-style-update-check-done");
  490.     assert("Expected 'no-update-available', got '" + updateUrlNoUpdate + "'.", updateUrlNoUpdate == "no-update-available");
  491. }
  492.  
  493.  
  494. var updateUrlWithUpdate = null;
  495. var updateUrlWithUpdateObserver = {
  496.     observe: function(subject, topic, data) {
  497.         if (subject.name == "testUpdateUrlWithUpdate") {
  498.             updateUrlWithUpdate = data;
  499.         }
  500.     }
  501. }
  502. function testUpdateUrlWithUpdate() {
  503.     var style = Components.classes["@userstyles.org/style;1"].createInstance(Components.interfaces.stylishStyle);
  504.     style.init(null, "data:text/css,* { color: red}", null, "testUpdateUrlWithUpdate", "* {color: blue}", false, null);
  505.     observerService.addObserver(updateUrlWithUpdateObserver, "stylish-style-update-check-done", false);
  506.     style.checkForUpdates();
  507. }
  508. function asyncUpdateUrlWithUpdate() {
  509.     observerService.removeObserver(updateUrlWithUpdateObserver, "stylish-style-update-check-done");
  510.     assert("Expected 'update-available', got '" + updateUrlWithUpdate + "'.", updateUrlWithUpdate == "update-available");
  511. }
  512.  
  513.  
  514. var updateNotAvailable = null;
  515. var updateNotAvailableObserver = {
  516.     observe: function(subject, topic, data) {
  517.         if (subject.name == "testUpdateNotAvailable") {
  518.             updateNotAvailable = data;
  519.         }
  520.     }
  521. }
  522. function testUpdateNotAvailable() {
  523.     var style = Components.classes["@userstyles.org/style;1"].createInstance(Components.interfaces.stylishStyle);
  524.     style.init(null, null, null, "testUpdateNotAvailable", "* {color: blue}", false, null);
  525.     observerService.addObserver(updateNotAvailableObserver, "stylish-style-update-check-done", false);
  526.     style.checkForUpdates();
  527. }
  528. function asyncUpdateNotAvailable() {
  529.     observerService.removeObserver(updateNotAvailableObserver, "stylish-style-update-check-done");
  530.     assert("Expected 'no-update-possible', got '" + updateNotAvailable + "'.", updateNotAvailable == "no-update-possible");
  531. }
  532.  
  533.  
  534. var runUpdateAvailable = null;
  535. var runUpdateAvailableStyle = null;
  536. var runUpdateAvailableObserver = {
  537.     QueryInterface: XPCOMUtils.generateQI([Components.interfaces.nsIObserver, Components.interfaces.nsISupports]),
  538.     observe: function(subject, topic, data) {
  539.         if (runUpdateAvailableStyle == subject) {
  540.             runUpdateAvailable = data;
  541.         }
  542.     }
  543. }
  544. function testRunUpdateAvailable() {
  545.     runUpdateAvailableStyle = Components.classes["@userstyles.org/style;1"].createInstance(Components.interfaces.stylishStyle);
  546.     runUpdateAvailableStyle.init(null, "data:text/css,* {color: red}", null, "Unit test testRunUpdateAvailable", "* {color: blue}", false, null);
  547.     observerService.addObserver(runUpdateAvailableObserver, "stylish-style-update-done", false);
  548.     runUpdateAvailableStyle.applyUpdate();
  549. }
  550. function asyncRunUpdateAvailable() {
  551.     observerService.removeObserver(runUpdateAvailableObserver, "stylish-style-update-done");
  552.     assert("Expected 'update-success', got '" + runUpdateAvailable + "'.", runUpdateAvailable == "update-success");
  553.     assert("Style code not updated", runUpdateAvailableStyle.code == "* {color: red}");
  554.     runUpdateAvailableStyle.delete();
  555. }
  556.  
  557.  
  558. var runUpdateNotAvailable = null;
  559. var runUpdateNotAvailableStyle = null;
  560. var runUpdateNotAvailableObserver = {
  561.     QueryInterface: XPCOMUtils.generateQI([Components.interfaces.nsIObserver, Components.interfaces.nsISupports]),
  562.     observe: function(subject, topic, data) {
  563.         if (runUpdateNotAvailableStyle == subject) {
  564.             runUpdateNotAvailable = data;
  565.         }
  566.     }
  567. };
  568. function testRunUpdateNotAvailable() {
  569.     runUpdateNotAvailableStyle = Components.classes["@userstyles.org/style;1"].createInstance(Components.interfaces.stylishStyle);
  570.     runUpdateNotAvailableStyle.init(null, null, null, "Unit test testRunUpdateNotAvailable", "* {color: blue}", false, null);
  571.     observerService.addObserver(runUpdateNotAvailableObserver, "stylish-style-update-done", false);
  572.     runUpdateNotAvailableStyle.applyUpdate();
  573. }
  574. function asyncRunUpdateNotAvailable() {
  575.     observerService.removeObserver(runUpdateNotAvailableObserver, "stylish-style-update-done");
  576.     assert("Expected 'no-update-possible', got '" + runUpdateNotAvailable + "'.", runUpdateNotAvailable == "no-update-possible");
  577.     assert("Style code not updated", runUpdateNotAvailableStyle.code == "* {color: blue}");
  578. }
  579.  
  580.  
  581. function checkValues(style, url, updateUrl, md5Url, name, code) {
  582.     assert("URL doesn't match", style.url == url);
  583.     assert("Update URL doesn't match", style.updateUrl == updateUrl);
  584.     assert("MD5 URL doesn't match", style.md5Url == md5Url);
  585.     assert("Name doesn't match", style.name == name);
  586.     assert("Code doesn't match", style.code == code);
  587.     assert("Style became enabled", !style.enabled);
  588. }
  589.  
  590. function getButtonStyle() {
  591.     return window.getComputedStyle(document.getElementById("test"), "");
  592. }
  593.  
  594. function delay(ms) {
  595.     var end = (Date.now()) + ms;
  596.     while (end > (Date.now()))
  597.         Math.sin(Math.random());
  598. }
  599.  
  600. function arraysEqual(a, b) {
  601.     if (a.length != b.length)
  602.         return false;
  603.     return a.every(function(v) {
  604.         return b.indexOf(v) > -1;
  605.     });
  606. }
  607.